package kr.ac.kongju.gedl.index.service;

import java.sql.SQLException;
import java.util.List;

import kr.ac.kongju.gedl.common.util.ListResultVO;
import kr.ac.kongju.gedl.index.vo.IndexVO;
import kr.ac.kongju.gedl.item.vo.ItemFileVO;
import kr.ac.kongju.gedl.item.vo.ItemVO;
import kr.ac.kongju.gedl.item.vo.ItemLevelVO;
import kr.ac.kongju.gedl.item.vo.ItemLinkVO;
import kr.ac.kongju.gedl.item.vo.ItemXmlVO;


public interface IndexService {

	/**
	 * registerItemInfo
	 * 아이템정보 등록
	 * @param itemInfo
	 * @return BoardVO
	 */
	public abstract ItemVO registerItemInfo(ItemVO itemInfo);

	/**
	 * updateItemInfo
	 * 아이템정보 갱신
	 * @param itemInfo
	 * @return ItemVO
	 */
	public abstract ItemVO updateItemInfo(ItemVO itemInfo);

	/**
	 * deleteItemInfo
	 * 아이템정보 삭제
	 * @param itemId
	 * @return result
	 */
	public abstract int deleteItemInfo(String itemId);

	/**
	 * ====================================================================
	 * retrieveItemInfo
	 * ItemInfo 조회
	 * @param SearchVO
	 * @return ItemVO
	 * ====================================================================
	 */
	public abstract ItemVO retrieveItemInfo(ItemVO itemInfo)
			throws Exception;

	/**
	 * ====================================================================
	 * retrieveListCountItemInfo
	 * ItemInfo 검색결과 수
	 * @param SearchVO
	 * @return
	 * ====================================================================
	 */
	public abstract int retrieveItemCount(ItemVO searchCondition)
			throws Exception;

	/**
	 * ====================================================================
	 * retrieveListItemInfo
	 * ItemInfo 검색
	 * @param SearchVO
	 * @return
	 * ====================================================================
	 */
	public abstract ListResultVO<ItemVO> retrieveItemList(
			ItemVO searchCondition) throws Exception;
	
	/**
	 * retrieveListItemFront
	 * 아이템ID에 해당하는 Front Description 하위요소문자열 반환
	 * @param 
	 * @return 형식: 엘리먼트명:@name
	 * @throws SQLException
	 */
	public abstract String retrieveItemFront(String itemId);

	/**
	 * retrieveLevelFront
	 * 아이템ID와 레벨ID에 해당하는 Front Description 하위요소문자열 반환
	 * @param 
	 * @return 형식: 엘리먼트명:@name
	 * @throws SQLException
	 */
	public abstract String retrieveLevelFront(String itemId, String levelId);

	/**************************************************************************
	 * ItemXml
	 **************************************************************************/
	/**
	 * ====================================================================
	 * retrieveItemXml
	 * ItemXml 조회
	 * @param itemXml
	 * @return itemXml
	 * ====================================================================
	 */
	public abstract ItemXmlVO retrieveItemXml(ItemXmlVO itemXml)
			throws Exception;

	/**
	 * ====================================================================
	 * retrieveListCountItemXml
	 * ItemXml 검색결과 수
	 * @param SearchVO
	 * @return
	 * ====================================================================
	 */
	public abstract int retrieveListCountItemXml(ItemVO searchCondition)
			throws Exception;

	/**
	 * ====================================================================
	 * retrieveListItemXml
	 * ItemXml 검색
	 * @param ItemXmlVO
	 * @return
	 * ====================================================================
	 */
	public abstract ListResultVO<ItemXmlVO> retrieveListItemXml(
			ItemVO searchCondition) throws Exception;

	/**
	 * ====================================================================
	 * retrieveListItemXml
	 * ItemXml 검색
	 * @param ItemXmlVO
	 * @return
	 * ====================================================================
	 */
	public abstract List<ItemXmlVO> retrieveListItemXml(String itemId,
			String xmlId) throws Exception;

	/**************************************************************************
	 * ItemLevel
	 **************************************************************************/
	/**
	 * updateItemLevelOtherTypes
	 * 레벨(otherTypes)정보 갱신
	 * @param itemInfo
	 * @return ItemVO
	 */
	public abstract ItemLevelVO updateItemLevelOtherTypes(ItemLevelVO itemLevel);

	/**
	 * updateListItemLevelOtherTypes
	 * 레벨(otherTypes)정보 갱신
	 * @param itemInfo
	 * @return ItemVO
	 */
	public abstract int updateListItemLevelOtherTypes(
			List<ItemLevelVO> itemLevelList);

	/**
	 * ====================================================================
	 * retrieveItemLevel
	 * ItemLevel 조회
	 * @param ItemLevelVO
	 * @return ItemLevelVO
	 * ====================================================================
	 */
	public abstract ItemLevelVO retrieveItemLevel(ItemLevelVO itemLevel)
			throws Exception;

	/**
	 * ====================================================================
	 * retrieveItemLevelSimple
	 * ItemLevel 조회(levelId에 해당하는 기사 여부용)
	 * @param ItemLevelVO
	 * @return ItemLevelVO
	 * ====================================================================
	 */
	public abstract ItemLevelVO retrieveItemLevelSimple(ItemLevelVO itemLevel)
			throws Exception;

	/**
	 * ====================================================================
	 * retrieveListCountItemLevel
	 * ItemLevel 검색결과수
	 * @param SearchVO
	 * @return
	 * ====================================================================
	 */
	public abstract int retrieveListCountItemLevel(ItemVO searchCondition)
			throws Exception;

	/**
	 * ====================================================================
	 * retrieveListItemLevel
	 * ItemLevel 검색
	 * @param ItemLevelVO
	 * @return
	 * ====================================================================
	 */
	public abstract ListResultVO<ItemLevelVO> retrieveListItemLevel(
			ItemVO searchCondition) throws Exception;

	/**
	 * ====================================================================
	 * retrieveListItemLevelSimple
	 * ItemLevel 검색(연관정보제외)
	 * @param ItemLevelVO
	 * @return
	 * ====================================================================
	 */
	public abstract List<ItemLevelVO> retrieveListItemLevelSimple(
			ItemVO searchCondition) throws Exception;

	/**
	 * ====================================================================
	 * retrieveListCountItemLevelGroupBy
	 * ItemLevel 검색결과수
	 * @param SearchVO
	 * @return
	 * ====================================================================
	 */
	public abstract int retrieveListCountItemLevelGroupBy(
			ItemVO searchCondition) throws Exception;

	/**
	 * ====================================================================
	 * retrieveListItemLevelGroupBy
	 * ItemLevel 검색
	 * @param ItemLevelVO
	 * @return
	 * ====================================================================
	 */
	public abstract ListResultVO<ItemLevelVO> retrieveListItemLevelGroupBy(
			ItemVO searchCondition) throws Exception;

	/**
	 * ====================================================================
	 * retrieveListItemLevelYear
	 * 연표의 모든 레벨1정보조회
	 * @param ItemLevelVO
	 * @return
	 * ====================================================================
	 */
	public abstract List<ItemLevelVO> retrieveListItemLevelYear(
			ItemVO searchCondition) throws Exception;

	/**
	 * ====================================================================
	 * retrieveListItemLevelDay
	 * 연표의 모든 레벨1정보조회
	 * @param ItemLevelVO
	 * @return
	 * ====================================================================
	 */
	public abstract List<ItemLevelVO> retrieveListItemLevelDay(
			ItemVO searchCondition) throws Exception;

	/**
	 * ====================================================================
	 * retrieveParentListItemLevel
	 * 상위기사리스트조회
	 * @param ItemLevelVO
	 * @return itemLevel
	 * ====================================================================
	 */
	public abstract List<ItemLevelVO> retrieveParentListItemLevel(
			ItemLevelVO itemLevel) throws Exception;

	/**
	 * ====================================================================
	 * retrieveChildListItemLevel
	 * 하위기사리스트조회
	 * @param ItemLevelVO
	 * @return itemLevel
	 * ====================================================================
	 */
	public abstract List<ItemLevelVO> retrieveChildListItemLevel(
			ItemLevelVO itemLevel) throws Exception;

	/**
	 * ====================================================================
	 * retrieveSiblingListItemLevel
	 * 형제기사리스트조회
	 * @param ItemLevelVO
	 * @return itemLevel
	 * ====================================================================
	 */
	public abstract List<ItemLevelVO> retrieveSiblingListItemLevel(
			ItemLevelVO itemLevel) throws Exception;

	/**
	 * ====================================================================
	 * retrievePrevItemLevel
	 * 이전기사 조회
	 * @param ItemLevelVO
	 * @return itemLevel
	 * ====================================================================
	 */
	public abstract String retrievePrevItemLevel(ItemLevelVO itemLevel);

	/**
	 * ====================================================================
	 * retrieveNextItemLevel
	 * 다음기사 조회
	 * @param LawSubVO
	 * @param request 
	 * @return lawSub
	 * ====================================================================
	 */
	public abstract String retrieveNextItemLevel(ItemLevelVO itemLevel);

	/**
	 * ====================================================================
	 * retrieveListItemLevelByItem
	 * 카테고리에 해당하는 기사 리스트
	 * @param category
	 * @return
	 * ====================================================================
	 */
	public abstract List<ItemLevelVO> retrieveListItemLevelByItem(
			String category) throws Exception;

	/**
	 * ====================================================================
	 * retrieveListCountItemLevelEducation
	 * 역사교육 서비스대상 기사수
	 * @param category
	 * @return
	 * ====================================================================
	 */
	public abstract int retrieveListCountItemLevelEducation(
			ItemVO searchCondition) throws Exception;

	/**
	 * 역사교육 서비스대상 기사 조회
	 * @param searchCondition
	 * @return
	 */
	public abstract ListResultVO<IndexVO> retrieveListItemLevelEducation(
			ItemVO searchCondition) throws Exception;

	/**
	 * [역사교육] 하위기사중 Text가 있는 첫번째 기사 조회		
	 * @param levelId
	 * @return
	 */
	public abstract String retrieveChildText(String levelId);

	/**
	 * [역사교육] 하위기사중 이미지 있는 첫번째 이미지 조회		
	 * @param levelId
	 * @return
	 */
	public abstract ItemFileVO retrieveChildImage(String levelId);

	/**
	 * [역사교육] 페이지에 해당하는 기사정보 조회	
	 * @param levelId
	 * @param page
	 * @return
	 */
	public abstract ItemLevelVO retrieveItemLevelbyPage(String levelId,
			String page);

	/**
	 * [역사교육#뷰어] 하위기사중 페이지가 있는 기사 조회   	
	 * @param levelId
	 * @return
	 */
	public abstract ItemLevelVO retrieveChildItemLevelbyPage(String levelId);

	/**************************************************************************
	 * ItemFile
	 **************************************************************************/
	/**
	 * ====================================================================
	 * retrieveItemFile
	 * ItemFile 조회
	 * @param ItemFileVO
	 * @return ItemFileVO
	 * ====================================================================
	 */
	public abstract ItemFileVO retrieveItemFile(ItemFileVO itemFile)
			throws Exception;

	/**
	 * ====================================================================
	 * retrieveListCountItemFile
	 * ItemFile 검색결과 수
	 * @param SearchVO
	 * @return
	 * ====================================================================
	 */
	public abstract int retrieveListCountItemFile(ItemVO searchCondition)
			throws Exception;

	/**
	 * ====================================================================
	 * retrieveListItemFile
	 * ItemFile 검색
	 * @param ItemFileVO
	 * @return
	 * ====================================================================
	 */
	public abstract ListResultVO<ItemFileVO> retrieveListItemFile(
			ItemVO searchCondition) throws Exception;

	/**
	 * updateItemFile
	 * ItemFile 정보 갱신
	 * @param itemFile
	 * @return
	 */
	public abstract ItemFileVO updateItemFile(ItemFileVO itemFile);

	/**
	 * ====================================================================
	 * retrieveListItemfileGroupByItemId
	 * 이미지가 있는 아이템정보 조회
	 * @param SearchVO
	 * @return
	 * ====================================================================
	 */
	public abstract List<ItemVO> retrieveListItemfileGroupByItemId()
			throws Exception;

	/**************************************************************************
	 * ItemLink
	 **************************************************************************/
	/**
	 * ====================================================================
	 * retrieveItemLink
	 * ItemLink 조회
	 * @param ItemLinkVO
	 * @return ItemLinkVO
	 * ====================================================================
	 */
	public abstract ItemLinkVO retrieveItemLink(ItemLinkVO itemLink);

	/**
	 * ====================================================================
	 * retrieveListCountItemLink
	 * ItemLink 검색결과 수
	 * @param SearchVO
	 * @return
	 * ====================================================================
	 */
	public abstract int retrieveListCountItemLink(ItemVO searchCondition)
			throws Exception;

	/**
	 * ====================================================================
	 * retrieveListItemLink
	 * ItemLink 검색
	 * @param ItemLinkVO
	 * @return
	 * ====================================================================
	 */
	public abstract ListResultVO<ItemLinkVO> retrieveListItemLink(
			ItemVO searchCondition) throws Exception;
	
	
	/**
	 * ====================================================================
	 * retrieveItemLevel
	 * ItemLevel 조회
	 * @param ItemLevelVO
	 * @return ItemLevelVO
	 * ====================================================================
	 */
	public abstract ItemLevelVO retrieveItemLevelWithoutXML(ItemLevelVO itemLevel)
			throws Exception;
	
	/**
	 * ====================================================================
	 * retrieveItemLevel
	 * ItemLevel 조회
	 * @param ItemLevelVO
	 * @return ItemLevelVO
	 * ====================================================================
	 */
	public abstract String retrieveItemLevelXML(ItemLevelVO itemLevel)
			throws Exception;

}